Skip to content

Simplification of Phase 2 HLT tracking configs by updating HighPurity ID with pass-through options#208

Merged
github-actions[bot] merged 1 commit intomasterfrom
trackClassifierForDispTrks_updateCollections_1600pre1
Nov 26, 2025
Merged

Simplification of Phase 2 HLT tracking configs by updating HighPurity ID with pass-through options#208
github-actions[bot] merged 1 commit intomasterfrom
trackClassifierForDispTrks_updateCollections_1600pre1

Conversation

@VourMa
Copy link
Collaborator

@VourMa VourMa commented Oct 14, 2025

This PR updates the high purity ID with two passthrough options:
a) Passthrough for tracks without pixel tracker hits. The only requirement for these tracks is that they have at least 4 hits (that covers T5s with a potential loss of a layer during fitting). The latter requirement is configurable.
b) Passthrough for all tracks. No requirement is applied on the tracks. This is exploited in the single iteration configurations running LST seeding, as these configurations have a very low fake+duplicate. Running the high purity module unifies the configuration and enables the correct usage in downstream objects, in case they require tracks with high purity ID.

The above updates enable a large simplification of the HLT tracking configurations, which is done also in this PR. Below, the relevant procModifier combinations have been validated. The current configuration is in blue and the configuration proposed in this PR is in red:

  1. trackingLST, falling under option a) above (all plots)
image
  1. trackingLST,seedingLST, falling under option a) above (all plots)
image
  1. singleIterPatatrack,phase2CAExtension,trackingLST, falling under option a) above (all plots)
image
  1. singleIterPatatrack,phase2CAExtension,trackingLST,seedingLST, falling under option b) above (all plots)
image
  1. phase2CAExtension,singleIterPatatrack,trackingLST,seedingLST,trackingMkFitCommon,hltTrackingMkFitInitialStep, falling under option b) above (all plots)
image

Comments on the physics perfomance:

  • Configurations 1, 2, 3 utilize the TrackListMerger module in a different way (cleaning tracks within the same collection instead of separate collections). This leads to a small increase of the efficiency and either some small decrease of fake rate (for the two iteration setup) or some increase of fake+duplicate rate (in the single iteration setup, where it still remains below 2.5% in any η range).
  • Configurations 4, 5 remain unchanged: before they were using built tracks in the general track collection, while they now use the high purity ID tracks, with the passthrough option enabled, in the general track collection, and these two configurations are fully equivalent.

@VourMa VourMa marked this pull request as draft October 14, 2025 13:11
@VourMa
Copy link
Collaborator Author

VourMa commented Oct 14, 2025

/run all
/run gpu-all

@github-actions
Copy link

The PR was built and ran successfully in standalone mode. Here are some of the comparison plots.

Efficiency vs pT comparison Efficiency vs eta comparison
Fake rate vs pT comparison Fake rate vs eta comparison
Duplicate rate vs pT comparison Duplicate rate vs eta comparison

The full set of validation and comparison plots can be found here.

Here is a timing comparison:

   Evt    Hits       MD       LS      T3       T5       pLS       pT5      pT3      TC       Reset    Event     Short             Rate
   avg     28.4    365.1    270.4    119.6     44.4    688.2    122.6    126.1    167.7      1.5    1934.0    1217.4+/- 288.5     595.1   explicit[s=4] (target branch)
   avg     28.2    366.9    268.2    119.0     44.0    687.5    121.5    125.9    167.2      1.3    1929.8    1214.0+/- 292.2     599.8   explicit[s=4] (this PR)

@github-actions
Copy link

The PR was built and ran successfully with CMSSW. Here are some plots.

OOTB All Tracks
Efficiency and fake rate vs pT, eta, and phi

The full set of validation and comparison plots can be found here.

@github-actions
Copy link

The PR was built and ran successfully with CMSSW on GPU. Here are some plots.

OOTB All Tracks
Efficiency and fake rate vs pT, eta, and phi

The full set of validation and comparison plots can be found here.

@github-actions
Copy link

The PR was built and ran successfully in standalone mode on GPU. Here are some of the comparison plots.

Efficiency vs pT comparison Efficiency vs eta comparison
Fake rate vs pT comparison Fake rate vs eta comparison
Duplicate rate vs pT comparison Duplicate rate vs eta comparison

The full set of validation and comparison plots can be found here.

Here is a timing comparison:

   Evt    Hits       MD       LS      T3       T5       pLS       pT5      pT3      TC       Reset    Event     Short             Rate
[target branch]
   avg     15.1      0.4      0.4      0.5      0.6      0.3      0.6      0.3      0.9      0.0      19.2       3.8+/-  0.8      19.3   explicit[s=1]
   avg      0.9      0.6      0.6      0.7      0.8      0.3      0.9      0.4      1.2      0.0       6.5       5.3+/-  1.1       3.3   explicit[s=2]
   avg      1.5      0.8      1.0      1.2      1.3      0.4      1.5      0.7      1.9      0.0      10.4       8.5+/-  1.5       5.3   explicit[s=4]
   avg      2.1      1.3      1.5      1.7      1.8      0.6      2.1      0.9      2.6      0.0      14.7      12.0+/-  3.0       2.5   explicit[s=6]
   avg      2.6      1.7      1.9      2.3      2.5      0.7      2.7      1.3      3.3      0.0      19.0      15.7+/-  3.1       4.9   explicit[s=8]
[this PR]
   avg     15.5      0.4      0.4      0.5      0.6      0.3      0.6      0.3      0.9      0.0      19.6       3.8+/-  0.8      19.6   explicit[s=1]
   avg      0.8      0.5      0.6      0.7      0.8      0.3      1.0      0.5      1.2      0.0       6.5       5.3+/-  1.0       3.3   explicit[s=2]
   avg      1.5      0.9      1.0      1.2      1.3      0.4      1.5      0.7      1.9      0.0      10.4       8.5+/-  1.7       2.6   explicit[s=4]
   avg      2.1      1.3      1.4      1.7      1.8      0.5      2.1      0.9      2.6      0.0      14.6      11.9+/-  2.5       2.5   explicit[s=6]
   avg      2.8      1.7      2.0      2.4      2.4      0.7      2.6      1.2      3.2      0.0      19.0      15.6+/-  3.3       2.4   explicit[s=8]

(~singleIterPatatrack & trackingLST & ~seedingLST).toReplaceWith(hltGeneralTracks, _hltGeneralTracksLST)

_hltGeneralTracksSingleIterPatatrackLST = hltGeneralTracks.clone(
TrackProducers = ["hltInitialStepTrackSelectionHighPuritypTTCLST", "hltInitialStepTrackSelectionHighPuritypLSTCLST", "hltInitialStepTracksT5TCLST"],
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

does the order of candidates matter for the TrackListMerger? In the earlier version we have pTx, pLS, T5, while in the LST TC collection the order is pTx, T5, pLS.
For a test I can suggest to change the order here to see if there is a change and if that will agree with the version of this PR.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good idea, I did a quick test to try this. I rolled back to the master branch (before any changes to the ID) and changed the order of the general track collections. Here is the hltGeneralTracks module in this updated configuration:

Image

Then, I ran this and reproduced the plots, comparing "old ID", "old ID + swapped T5 and pLS order" and "new ID, new collections". This is what I got (all plots):

Image

Unfortunately this doesn't seem to be the cause...

Copy link
Collaborator Author

@VourMa VourMa Nov 5, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Following up on our discussion, I changed the order the LST TrackCandidates are added in the LSTOutputConventer product. For completeness, here is how I did it:

  • I commented out this line:
    outputTC.emplace_back(tc);
  • I added in L285 of the same file:
    • For pT -> T5 -> pLS order (pTT5pLS label in the plot, in red):
      outputTC.insert(outputTC.end(), outputpTTC.begin(),outputpTTC.end()); outputTC.insert(outputTC.end(), outputT5TC.begin(),outputT5TC.end()); outputTC.insert(outputTC.end(), outputpLSTC.begin(),outputpLSTC.end());
    • For pT -> pLS -> T5 order (pTpLST5 label in the plot, in black):
      outputTC.insert(outputTC.end(), outputpTTC.begin(),outputpTTC.end()); outputTC.insert(outputTC.end(), outputpLSTC.begin(),outputpLSTC.end()); outputTC.insert(outputTC.end(), outputT5TC.begin(),outputT5TC.end());

No differences observed (all plots):
image

@slava77
Copy link

slava77 commented Oct 21, 2025

alpaka,singleIterPatatrack,trackingLST (all plots)

most of the increase is with no pixel hits, most likely T5s
image

@VourMa VourMa force-pushed the trackClassifierForDispTrks_updateCollections_1600pre1 branch from aa80881 to 2a6b1c8 Compare November 5, 2025 19:28
// for tracks without pixel hits (displaced tracks)
auto nLayers = trk.hitPattern().trackerLayersWithMeasurement();
if (passThroughForDisplaced) {
if (nPixelHits(trk) == 0 && nLayers > 4)
Copy link

@slava77 slava77 Nov 6, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

better make this (nLayers) configurable

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should be fixed in the last commit.

@VourMa VourMa changed the base branch from master to trackClassifierForDispTrks_updateCollections_1600pre1_proper November 6, 2025 12:34
@VourMa VourMa changed the base branch from trackClassifierForDispTrks_updateCollections_1600pre1_proper to master November 6, 2025 12:35
@VourMa VourMa force-pushed the trackClassifierForDispTrks_updateCollections_1600pre1 branch from 98984d1 to f471408 Compare November 6, 2025 12:41
@VourMa
Copy link
Collaborator Author

VourMa commented Nov 6, 2025

/run all

@github-actions
Copy link

github-actions bot commented Nov 6, 2025

The PR was built and ran successfully in standalone mode. Here are some of the comparison plots.

Efficiency vs pT comparison Efficiency vs eta comparison
Fake rate vs pT comparison Fake rate vs eta comparison
Duplicate rate vs pT comparison Duplicate rate vs eta comparison

The full set of validation and comparison plots can be found here.

Here is a timing comparison:

   Evt    Hits       MD       LS      T3       T5       pLS       pT5      pT3      TC       Reset    Event     Short             Rate
   avg     29.6    378.7    252.8    117.3     52.4    678.4    136.2    125.7    195.5      1.0    1967.6    1259.6+/- 300.6     608.4   explicit[s=4] (target branch)
   avg     29.9    381.6    253.7    117.7     52.8    679.0    137.8    126.8    194.9      1.0    1975.1    1266.2+/- 301.6     615.9   explicit[s=4] (this PR)

@github-actions
Copy link

github-actions bot commented Nov 6, 2025

The PR was built and ran successfully with CMSSW. Here are some plots.

OOTB All Tracks
Efficiency and fake rate vs pT, eta, and phi

The full set of validation and comparison plots can be found here.

Copy link

@slava77 slava77 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the updates look OK, but then we have a side-discussion about having a more relaxed nLayers cut in the seedingLST case (a mix with mkFit).

It's probably time to change to no-draft
and consider squashing the commits

@VourMa VourMa force-pushed the trackClassifierForDispTrks_updateCollections_1600pre1 branch from 79b5578 to 8b261c0 Compare November 12, 2025 14:54
@VourMa VourMa marked this pull request as ready for review November 12, 2025 16:34
@VourMa VourMa changed the title Simplification of Phase 2 HLT tracking configs by updating HighPurity ID to be a pass-through for displaced tracks Simplification of Phase 2 HLT tracking configs by updating HighPurity ID with pass-through options Nov 12, 2025
@VourMa VourMa requested a review from slava77 November 12, 2025 16:35
@VourMa
Copy link
Collaborator Author

VourMa commented Nov 12, 2025

/run all
/run gpu-all

@github-actions
Copy link

The PR was built and ran successfully in standalone mode. Here are some of the comparison plots.

Efficiency vs pT comparison Efficiency vs eta comparison
Fake rate vs pT comparison Fake rate vs eta comparison
Duplicate rate vs pT comparison Duplicate rate vs eta comparison

The full set of validation and comparison plots can be found here.

Here is a timing comparison:

   Evt    Hits       MD       LS      T3       T5       pLS       pT5      pT3      TC       Reset    Event     Short             Rate
   avg     28.5    372.1    300.5    121.6     46.1    684.7    121.5    127.0    165.8      1.5    1969.2    1256.0+/- 296.2     602.1   explicit[s=4] (target branch)
   avg     28.4    375.1    297.9    121.5     45.6    677.9    122.3    128.9    166.8      1.4    1965.9    1259.5+/- 301.1     605.1   explicit[s=4] (this PR)

@github-actions
Copy link

The PR was built and ran successfully with CMSSW. Here are some plots.

OOTB All Tracks
Efficiency and fake rate vs pT, eta, and phi

The full set of validation and comparison plots can be found here.

@VourMa VourMa force-pushed the trackClassifierForDispTrks_updateCollections_1600pre1 branch 3 times, most recently from 4055b7b to 5c966db Compare November 19, 2025 13:20
@VourMa VourMa force-pushed the trackClassifierForDispTrks_updateCollections_1600pre1 branch from 5c966db to 178b635 Compare November 19, 2025 13:47
@github-actions github-actions bot merged commit 324fadc into master Nov 26, 2025
trackCandidates = ["hltInitialStepTrackCandidates:pTCsLST", "hltInitialStepTrackCandidates:t5TCsLST", "hltHighPtTripletStepTrackCandidates"])
(~singleIterPatatrack & trackingLST & seedingLST).toModify(process.trackingNtuple,
trackCandidates = ["hltInitialStepTrackCandidates:pTTCsLST", "hltInitialStepTrackCandidates:t5TCsLST", "hltHighPtTripletStepTrackCandidatespLSTCLST"])
singleIterPatatrack.toModify(process.trackingNtuple, trackCandidates = ["hltInitialStepTrackCandidates"])
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it looks like this needs to be undone; the number of candidate collections should be the same as the seed collections.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Which of all the configurations is problematic? I guess this one (L134):

(singleIterPatatrack & trackingLST & ~seedingLST).toModify(_seedProducers, names = ["hltInputLST", "hltInitialStepTrackCandidates"])

as it is the only one with singleIterPatatrack on and two seed collections?
Could you remind me of the logic of having also hltInitialStepTrackCandidates in the seed producers for that configuration?

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the ~singleIterPatatrack variants are still there and are also affected (although being phased out by other means now)

the setup before this PR was meant to cover the pixel seeds input to LST in the first collection and the T5 de novo seeds in the second collection

Copy link
Collaborator Author

@VourMa VourMa Feb 6, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK, so the problem is that L162-L163:

(~singleIterPatatrack & trackingLST & seedingLST).toModify(process.trackingNtuple,
        seedAlgoDetect = False, seedAlgos = [getattr(_algo,"initialStep"), getattr(_algo,"initialStep"), getattr(_algo,"highPtTripletStep")])

has three seed collections while L166 (that is applied for ~singleIterPatatrack) has two:

trackingPhase2PU140.toModify(process.trackingNtuple, trackCandidates = ["hltInitialStepTrackCandidates", "hltHighPtTripletStepTrackCandidates"])

Which configuration are you interested in? Do we need a patch or can you make do for now? Or does it cause any issues centrally?

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I need a fix to run tests for my #234 with the singleIter
I can include it there
I'm not committed to fix the multi-iter HLT variant.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants